#!/usr/bin/env node

const fs = require('fs')
const path = require('path')
const deConfig = {
  name: process.cwd().split('\\').reverse()[0]
}
const inquirer = require('inquirer')
const ejs = require('ejs')

// 需要定义 #!/usr/bin/env node 头
// 这是执行入口文件

// 脚手架工作流程:
// 发起命令行询问并获取对于的配置参数
// 获取模板文件信息
// 通过模板引擎渲染文件并写入项目目录中

function writeRenderFile(src, dest, config) {
  ejs.renderFile(src, config, (err, result) => {
    if (err) throw err
    // 写入项目目录下
    fs.writeFileSync(dest, result)
  })
}

/**
 * 
 * @param {string} src 源文件根路径 
 * @param {string} dest 项目根路径
 * @param {string} pathName 文件路径
 * @param {object} config 配置
 */
function readAndWriteFiles(src, dest, pathName, config) {
  let stat = fs.statSync(path.join(src, pathName))
  if (stat.isDirectory()) {
    // 是文件夹，在输出目录下创建文件夹，并进行递归读写
    // 在项目下创建对应文件夹
    if (pathName) {
      // console.log(`mkdir: ${pathName}`)
      fs.mkdirSync(path.join(dest, pathName))
    }

    let list = fs.readdirSync(path.join(src, pathName))
    list.forEach(fileName => {
      readAndWriteFiles(src, dest, path.join(pathName, fileName), config)
    })
    return
  }
  // 普通文件，直接读写
  // console.log(`write: ${pathName}`)
  let result = fs.readFileSync(path.join(src, pathName), 'utf-8')
  fs.writeFileSync(path.join(dest, pathName), result)
}

// inquirer 一个发起命令行询问的工具


inquirer.prompt([
  {
    type: 'input',
    name: 'name',
    message: 'project name',
    default: deConfig.name
  }, {
    type: 'list',
    name: 'cssPrecompiler',
    message: 'select css precompiler',
    choices: [
      {
        name: 'none',
        value: null,
        checked: true
      },
      'sass',
      'stylus',
      'less'
    ]
  }, {
    type: 'confirm',
    name: 'isUseEslint',
    message: 'use eslint?',
    default: false
  }, {
    type: 'list',
    name: 'bgColor',
    message: 'select your background color',
    choices: [
      {
        name: 'white',
        value: 'white',
        checked: true
      },
      'pink',
      'red',
      'blue',
      'yellow'
    ]
  }, {
    type: 'input',
    name: 'describe',
    message: 'describe',
    default: 'describe'
  }, {
    type: 'checkbox',
    name: 'showInfo',
    message: 'select display info',
    choices: [
      'name',
      'date',
      'config',
      'describe'
    ]
  }
]).then((config) => {
  // console.log(config)
  const tmplDir = path.join(__dirname, 'templates')

  const destDir = process.cwd()
  readAndWriteFiles(tmplDir, destDir, '', config)
})
